$$.Server.request = function(){
	
	/**
	 * 是否POST提交数据。
	 * @return {Boolean}
	 */
	 this.isPOST	= function(){
		return Request.ServerVariables('HTTP_METHOD')() == "POST";
	 }
	 
	/**
	 * 返回是否Raw 的POST。这个方法在某种场合必须使用，例如Ext.Direct。
	 * 约定：凡application/json的提交均视作Raw POST。
	 * @return {Boolean}
	 */
	this.isRawPOST = function(){
		return this.isPOST() && (Request.ServerVariables('Content_Type')().indexOf('application/json')) != -1
	}
	
	/**
	 * Raw POST的解析器。Raw Post也是标准HTTP POST方式的一种，但不像key1=value2&key2=value2的形式提交数据，
	 * 而是一堆二进制的数据。
	 * 浏览器提交的POST数据视作原始的实际，须经过Adodb.Stream二进制解码后才可以使用。
	 * 注意：一旦使用过该方法。Request.Form('key')就无法使用，但QueryString仍可用。
	 * @return {Object}
	 */
	this.getRawPost = function (){
    	with(new ActiveXObject('Adodb.Stream')){
			open();
			type	 = 2;// 2 = adTypeText
			writeText(Request.binaryRead(Request.totalBytes));
			position = 0;
			charset  = "us-ascii";// gb2312？
			position = 2;
			eval('var requestObj = ' + readText());// 使用 eval()函数时，必须要一个变量来承载！
			close();
			return requestObj;
		}
    }
	
	/**
	 * 返回页面的路径。
	 * @return {String} url
	 */
	this.getPath = function(){
		return Request.ServerVariables('URL')();
	}
	
	this.method = function(){
		return Request.ServerVariables('HTTP_METHOD')();
	}

	/**
	 * 获取来自表单的各个字段的数据。HTTP FORM所提交的数据乃是key/value配对的结构。
	 * 本函数是把这些key/value集合转化成为JavaScript对象。这是post包最核心的函数。
	 * 对各个字段有decodeURI()、unescape()、$$.getPerm()自动类型转化的功能。
	 * @param {Boolean/String} isAllRequest true表示为返回QueryString和Form的Request对象集合。
	 * 如果指定form则返回表单的hash值，如果指定 QueryString 则返回URL上面的参数hash。
	 * @return {Object} 客户端提交的数据或查询参数。
	 */
	function every(collection){
		var count	= collection.count;
		var obj		= {
			count	: count				// 字段总数
		};
		var emu		= new Enumerator(collection);
		var key, v;
		
		while(count > 0 && !emu.atEnd()){
            key		 = emu.item().toString();
            v		 = collection(key)(); 	// MS ASP这里好奇怪，不加()不能返回字符串
            
            obj[key] = $$.getPrimitives(v);	// 进行自动类型转换。
			
			emu.moveNext();
		}
        
        return obj;
	};
	
	
	this.formPost	 = every.delegate(Request.Form);
	this.queryString = every.delegate(Request.QueryString);
}

$$.Server.Response = function(){

	/**
	 * 设置媒体类型
	 * @param {String} contentType HTTP内容类型。默认值是text/HTML。可选的
	 */
	this.writeHeader = function(text, contentType){
		switch(contentType){
			case 'html':
				Response.ContentType = 'text/html';
			break;
			case 'xml':
				Response.ContentType = 'text/xml';
			break;
			case 'json':
				Response.ContentType = 'text/json';
			break;
			case 'binary':
				Response.ContentType = 'application/x-download';
			break;
			default:
				Response.ContentType = contentType || 'text/html';
		}
	}
		
		/**
		 * 输出到客户端的HTML内容。
		 * @property {String}
		 */
	
	/**
	 * 
	 * @param	{String}	data
	 */
	this.writeData = function(data){
	/**
	 * 送入一个文件磁盘地址，使用ADODB.Stream组件下载。
	 * 文件大小有限制？
	 * 隐藏下载地址及防盗代码。 
	 * @param {String} filePath
	 * @return {Boolean} 是否传送成功。
	 */

		var 
			 fileObj
			,fileSize;
			
		with(new ActiveXObject("Scripting.FileSystemObject")){
			fileObj = getFile(filePath);
			if(!fileObj){
				throw '目标文件不存在！';
			}
			fileSize = fileObj.size;
		}
		
		// 防盗链
	
	    
	    with(new ActiveXObject("ADODB.Stream")){
	        Open();
	        Type = 1;
	        LoadFromFile(filePath);
		    Response.AddHeader("Content-DIsposItIon", "attachment; FIlename=" + F.Name);
		    Response.AddHeader("Content-Length", IntFilelength);
	        Response.Buffer      = True
		    Response.CharSet     = "UTF-8";
		    Response.ContentType = "application/x-download";
    		Response.Clear();
		    Response.BinaryWrite(Read());
		    Response.Flush();
		    Close();
	    }
	    return true;
	
	}
	
	this.write = function(){
		
	}
	
	this.setXML	= function(data, wrapTag, isCDATA){
		
		this.contentType = 'text/xml';
		
		if(typeof data == 'string'){
			if(wrapTag && !isCDATA){
				data = '<{0}>{1}</{0}>'.format(wrapTag, data);
			}else if(wrapTag && isCDATA){
				data = '<{0}>' + ("<![CD" + "ATA[") + "{1}" + ("]>" + ">")  + '</{0}>'.format(wrapTag, data.replace(("]>" +">"), "]&gt;&gt;"));
			}
			return data;
		}else{
			data = $$.XML.json2xml(data);
		}
		return datal		
	}
}